
// //需要js-md5的支持 用来判断子数据是否更新
// //需要自己封装的request______
// class websocket_data_update {  
//     constructor(obj) {  
//     let _this=this;
//     //待更新的列表
//     _this.objs=[];
//     //数据
//     _this.data={};
//     //匹配路径
//     _this.check_path=function(path1,path2) {  
//         try{ 
//             let path1_lst=[],path2_lst=[];
//             if(path1!=""){path1_lst=path1.split(".");}
//             if(path2!=""){path2_lst=path2.split(".");}
//             if (path1_lst.length>path2_lst.length){
//                 for (let i=0;i<path2_lst.length;i++){
//                     if (path2_lst[i]!=path1_lst[i]){return false}
//                 }
//             }else{
//                 for (let i=0;i<path1_lst.length;i++){
//                     if (path2_lst[i]!=path1_lst[i]){return false}
//                 }

//             }
//             return true
//         }
//         catch{return false}
//         } 
//     //更新数据
//     _this.update_val=function(obj){
//         //获取要更新的数据的路径
//         let path=obj.path;
//         //获取要更新的数据
//         let update_valx=_this.data;
//         let path_lst=[]
//         if(path!=""){path_lst=path.split(".");}
//         let idx=path_lst.length-1;
//         for(let i=0;i<idx;i++){update_valx=update_valx[path_lst[i]];}
//         //更新数据
//         if (path_lst.length>0){update_valx[path_lst[path_lst.length-1]]=JSON.stringify(JSON.parse(obj.data));}
//         else{_this.data=JSON.stringify(JSON.parse(obj.data));}
//     }
//     //连接服务器的websocket
//     _this.connect_socket=function(){
//     _this.ws = new WebSocket("ws://" + window.location.host + "/websocket");
//     // WebSocket连接成功后的回调
//     _this.ws.onopen = function(event) {
//         //params 附带参数 如账号信息
//         _this.ws.send(JSON.stringify({params:_this.return_params(),"type":"get_all"}));
//     };
//     // 接收服务器消息的回调
//     _this.ws.onmessage = function(event) {
//         try{
//             //将服务器下发的数据转为json格式 {path:"更新数据的路径 为空代表所有数据","data":data}
//             let recv_data=JSON.parse(event.data);
//             if (recv_data.type=="error"){
//                 Vue.prototype.$notify({type: 'error',message: recv_data.message||'错误'});console.log("数据更新失败:",recv_data.message,recv_data);return null;}
//             //更新数据
//             _this.update_val(recv_data);
//             //更新绑定 的数据
//             let temp_val={};//{path:{"md5":xxx,"data":xxx}}
//             //更新数据的路径
//             let path1=recv_data.path;//已经更新的路径
//             let path2=null;//待匹配的路径
//             let obj=null;//待处理的对象
//             let temp_val1=null,temp_val2=null;//待匹配的路径的数据对象 和待匹配的路径的路径数组
//             let new_md5=null;//待匹配的路径的md5值
//             //运行前置函数 
//             for(let i=0;i<_this.before_objs.length;i++){
//                 obj=_this.before_objs[i];
//                 path2=obj.path;
//                 if (_this.check_path(path1,path2)){
//                     //未有相同路径 生成相关数据
//                     if (temp_val[path2]===undefined){
//                         temp_val1=_this.data;
//                         if(temp_val2!=''){temp_val2=path2.split(".");}else{temp_val2=[];}
//                         for(let j=0;j<temp_val2.length;j++){temp_val1=temp_val1[temp_val2[j]]}
//                         new_md5=md5(JSON.stringify(temp_val1));//获取最新的md5
//                         temp_val[path2]={md5:new_md5,data:temp_val1};
//                     }
//                     //md5不同 则直接更新数据
//                     if (!(obj.md5===temp_val.md5)){
//                         obj.func({path:path1,data:temp_val[path2]})
//                     }
//                 }
//             }
//             //匹配路径 然后运行函数
//             for(let i=0;i<_this.objs.length;i++){
//                 obj=_this.objs[i];
//                 path2=obj.path;
//                 if (_this.check_path(path1,path2)){
//                     //未有相同路径 生成相关数据
//                     if (temp_val[path2]===undefined){
//                         temp_val1=_this.data;
//                         if(temp_val2!=''){temp_val2=path2.split(".");}else{temp_val2=[];}
//                         for(let j=0;j<temp_val2.length;j++){temp_val1=temp_val1[temp_val2[j]]}
//                         new_md5=md5(JSON.stringify(temp_val1));//获取最新的md5
//                         temp_val[path2]={md5:new_md5,data:temp_val1};
//                     }
//                     //md5不同 则直接更新数据
//                     if (!(obj.md5===temp_val.md5)){
//                         try{obj.func({path:path1,data:temp_val[path2]})}
//                         catch{
//                             if(obj[error_count]===undefined){obj[error_count]=1;}
//                             else{obj[error_count]++;}
//                             if (obj.type=='try1'&&obj[error_count]>1){_this.objs.slice(i,1);i--;}
//                             else if (obj.type=='try2'){_this.objs.slice(i,1);i--;}
//                         }
                        
//                     }
//                 }
//             }
//         }
//         catch{Vue.prototype.$notify({type: 'error',message: 'event.data错误'});console.log("event.data:",event.data)}
//     };

//     // WebSocket关闭时的回调
//     _this.ws.onclose = function(event) {
//         console.log("websocket已经关闭.");
//         _this.connect_socket();
//     };
//     // 错误处理
//     _this.ws.onerror = function(error) {
//         console.error("WebSocket错误:", error);
//     };
//     }
    
//     // 添加前置执行函数 func({"func":func,"path":path})
//     // path为要监听的路径 通过判断path路径的md5值是否一致来更新 如果path路径不存在 则不执行
//     _this.before_objs=[];
//     _this.add_before_func=function(obj){
//         _this.before_objs.push(obj);
//     }
//     //注册全局配置对象   register({"type":"try1","func":"要运行","param_path":xx.xx.xx,"recv_func":func})
//     //     type:'try1',//首次执行报错跳过，后续再执行如果报错就删除当前对象
//     //     type:'try2',//执行后如果报错就删除对象
//     //     type:'try3',//报错不删除对象
//     //     func:'',//要运行的函数名称
//     //     check_param_path:'',//要检查的数据有变动的索引  如{a:{b:1}}变为{a:{b:2}} 这里值就为a.b
//     //     recv_func:'' //向服务器更新数据的请求回调函数
//     // 注册后 获得主动获取数据的函数
//     // get_data(now_data) 主动获取注册路径的数据 now_data为当前数据
//     _this.register=null
//     // 注册更新
//     // 当数据更新、初始化时 会判断目标路径的值的md5是否产生变化 产生变化则 将变化后的数据传入回调函数中
//     _this.match_obj=function(obj){
//         for(let i=0;i<_this.objs.length;i++){
//             if(_this.objs[i]==obj){return i}
//         }
//     }
//     _this.register=function(obj_data){
//         _this.objs.push(obj_data);
//         let obj=obj_data;
//         //主动获取注册路径的数据
//         let get_data=function(now_data){
//             let now_md5=md5(JSON.stringify(now_data));//获取当前的md5
//             let path=obj.path;
            
//             let temp_val1=_this.data,temp_val2=[];
//             if(temp_val2!=''){temp_val2=path2.split(".");}
//             for(let j=0;j<temp_val2.length;j++){temp_val1=temp_val1[temp_val2[j]]}
//             let new_md5=md5(JSON.stringify(temp_val1));//获取最新的md5
//             //md5不同 则直接更新数据
//             if (!(new_md5===now_md5)){
//                 try{obj.func({path:path,data:temp_val1})}
//                 catch{
//                     let del_idx=null;
//                     if (obj.type=="try1" || obj.type=="try2"){del_idx=_this.match_obj(obj);}
//                     if(obj[error_count]===undefined){obj[error_count]=1;}
//                     else{obj[error_count]++;}
//                     if (obj.type=='try1'&&obj[error_count]>1){
//                         _this.objs.slice(del_idx,1);}
//                     else if (obj.type=='try2'){_this.objs.slice(del_idx,1);}
//                 }
//             }
//         }
//         return get_data
//     }  
// //向服务器更新数据 obj={"path:"xx.xx.xx","data":"data"} path为要更新的完整路径
//     _this.update=function(update_obj){
//         update_obj.params=_this.return_params();//添加附带参数如账号信息
//         update_obj.type="update";//表示更新数据
//         _this.ws.send(JSON.stringify(update_obj));//向服务器发送数据
//     }
//     }
    
//   }  
    
// //   // 创建对象  
// //   let test = new data_update({"data":{'a':{"b":1}}});  
// //    obj={
// //             type:'try1',//首次执行报错跳过，后续再执行如果报错就删除当前对象
// //             func:function(data){console.log('更新:',data)},//要运行的函数名称
// //             check_param_path:'a.b',//要检查的数据有变动的索引  如{a:{b:1}}变为{a:{b:2}} 这里值就为a.b
// //         }
// //   test.add(obj)
// //   test.update();
// //   test.data.a.b=3;
// //   test.update();
// //   test.update();
// //   //通过请求获取数据
  
// //   obj2={
// //     type:"request",//通过请求获取数据
// //     method:"get",//请求类型
// //     url:'请求url',//
// //     data:'初始数据',
// //     }
// //   window.config_now = new data_update(obj2);  
